package be.groept.ace.cursusplanning.persistency.persistencyProvidersText;

import java.util.Iterator;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import be.groept.ace.cursusplanning.model.AangebodenCursus;
import be.groept.ace.cursusplanning.model.Cursus;
import be.groept.ace.cursusplanning.model.Lector;
import be.groept.ace.cursusplanning.persistency.DBMS_Tekstbestanden;
import be.groept.ace.cursusplanning.persistency.IPersistentieController;
import be.groept.ace.cursusplanning.persistency.IPersistentieProvider;
import be.groept.ace.cursusplanning.persistency.Persisteerbaar;
import be.groept.ace.cursusplanning.persistency.SaveStringBuilder;

/**
 * @author Gouke Leplat
 * 
 * Voorziet de klasse Cursus van een methode om de nodige informatie
 * te verzamelen om een object van deze klasse weg te schrijven in een tekstbestand
 */

public class PersistencyProviderCursus implements IPersistentieProvider {

	Cursus cursus;

	/**
	 * bepaalt welk object deze persistentieprovider behandelt
	 * @param pObj
	 * 			object van het type Cursus
	 */
	@Override
	public void setTarget(Persisteerbaar pObj) {
		this.cursus = (Cursus) pObj;
	}
	

	/**
	 * 	geeft een array met strings terug aan de persistentiecontroller
	 * @param controller
	 * 		de persistentiecontroller waar de informatie naartoe moet gestuurd worden
	 * @return Object[] 
	 * 		array van String objecten
	 */
	@SuppressWarnings("unchecked")
	@Override
	public Object[] getInfoToBeSaved(IPersistentieController controller) {
		
		SaveStringBuilder S = new SaveStringBuilder();

		Object[] output = new Object[0];
		
		output = S.CreateObject(cursus,new Object[] {cursus.getCursusCode(),
												cursus.getCursusNaam(),
												cursus.getStudiePunten(),
												cursus.getLestijdPerWeek(),
												cursus.getOpleiding()},output);
		//lectors
		Iterator<?> it = cursus.getLectors().entrySet().iterator();
		
		while (it.hasNext()){
			Entry<Integer, Lector> ent = (Map.Entry<Integer, Lector >) it.next();
			
			output = S.Method("addLector", new Object[] {cursus.getLectors().get(ent.getKey())},output);
			
		}
		
		//voorgaandeCursussen
		it = cursus.getVoorgaandeCursussen().entrySet().iterator();
		
		while (it.hasNext()){
			Entry<Integer,Cursus> ent = (Map.Entry<Integer, Cursus >) it.next();
			
			output = S.Method("addVoorgaandeCursussen", new Object[] {cursus.getVoorgaandeCursussen().get(ent.getKey())},output);
		}
		
		//aangebodenCursussen
		List<AangebodenCursus>aangebodenCursussen = cursus.getAangebodenCursussen();
		
		for (int i = 0; i < aangebodenCursussen.size(); i++){
			
			output = S.Method("addAangebodenCursus",new Object[] {aangebodenCursussen.get(i)},output);
			
			((DBMS_Tekstbestanden)controller).writeObjectFile((Persisteerbaar) aangebodenCursussen.get(i));
		}
		return output;
	}


}
